package com.xygz.orm.table;

import com.xygz.orm.annotations.Table;
import com.xygz.orm.enums.KeyType;
import com.xygz.orm.enums.ValueType;
import com.xygz.orm.exception.ORMException;
import com.xygz.orm.type.TypeHandler;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.SQLException;

/**
 * 表字段
 *
 * @author xiyuan-lgz 2023-09-18 @version v1.0.0 新建与整理
 */
@SuppressWarnings("all")
public interface ZTableField {
    
    public ZTable getTable();
    /**
     * 获取SQL列
     *
     * @return 列名
     */
    public String getColumn();
    
    /**
     * 列数据类型
     *
     * @return 数据库类型
     */
    public ValueType getType();
    
    /**
     * 长度
     *
     * @return 长度
     */
    public int getLength();
    
    /**
     * 小数点刻度
     *
     * @return int
     */
    public int getScale();
    
    /**
     * 是否 非空
     *
     * @return true|false
     */
    public boolean isNotNull();
    
    /**
     * 是否主键
     *
     * @return true|false
     */
    public boolean isPrimary();
    
    /**
     * 是否自增, isPrimary() = true 下有效
     *
     * @return true|false
     */
    public boolean isIncrement();
    
    /**
     * 注释
     *
     * @return 列注释
     */
    public String getComment();
    
    
    /**
     * 字段是否包含在数据库中
     *
     * @return
     */
    public boolean exists();
    
    /**
     * 获取 字段全路径，例如：  com.xx.entity.Table1.id
     *
     * @return 字段前路径
     */
    public String getFullName();
    
    void setKeyType(KeyType keyType);
    
    /**
     * 获取 获取Java字段名
     */
    public Field getJavaField();
    
    public Class getJavaType();
    
    /**
     * 自定义类型转换器
     */
    public TypeHandler getTypeHandler();
    
    /**
     * 获取逐渐类型
     */
    public KeyType getKeyType();
    
    void setTypeHandler(TypeHandler handler);
    
    /**
     * 创建主键值
     *
     * @param data
     * @return
     * @throws SQLException
     * @throws ORMException
     */
    public Serializable newPrimaryKey(Object data) throws SQLException, ORMException;
    
    /**
     * 这只对象值
     *
     * @param owner
     * @param value
     * @param columnType
     * @throws SQLException
     * @throws ORMException
     */
    public void setValue(Object owner, Object value, int columnType) throws SQLException, ORMException;
    
    /**
     * 获取对象值
     *
     * @param owner
     * @return
     * @throws SQLException
     * @throws ORMException
     */
    public Object getValue(Object owner) throws SQLException, ORMException;
}
